#include <iostream>
#include <cstdlib>
#include <string>
#include <pthread.h>
#include <unistd.h>
#include <vector>

// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int ticket = 1000;
void *routine(void *args)
{
    while (true)
    {
        pthread_mutex_lock((pthread_mutex_t*)args);
        if (ticket > 0)
        {
            usleep(1000);
            std::cout << "我是线程我抢到了 ：" << ticket-- << "号票" << std::endl;
            pthread_mutex_unlock((pthread_mutex_t*)args);
        }
        else
        {
            pthread_mutex_unlock((pthread_mutex_t*)args);
            break;
        }
    }
    return nullptr;
}

int main()
{
    std::vector<pthread_t> tids;
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex , nullptr);

    for (int i = 0; i < 5; i++)
    {
        pthread_t tid;
        pthread_create(&tid, nullptr, routine, &mutex);
        tids.emplace_back(tid);
    }

    for (auto &tid : tids)
    {
        pthread_join(tid, nullptr);
    }
    
    pthread_mutex_destroy(&mutex);
    return 0;
}

// pthread_mutex_t glock;
// void *routine(void *args)
// {
//     std::string name = static_cast<char *>(args);
//     while (true)
//     {
//         //临界区开始
//         std::cout << name << std::endl;
//         //临界区结束
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, routine, (void *)"thread -1");
//     while (true)
//     {

//         sleep(1);
//         //临界区开始
//         std::cout << "我是主线程" << std::endl;
//         //临界区结束
//     }
//     pthread_join(tid, nullptr);
//     return 0;
// }